package log720.lab1;

import org.omg.CosNaming.*;

public class BureauClient {
	public static void main(String args[]) {
		try {
			BanqueDossiers banqueDossiers;
			BanqueInfractions banqueInfractions;

			org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

			if (args.length == 2) {
				// args[0] is an IOR-string
				banqueDossiers = BanqueDossiersHelper.narrow(orb.string_to_object(args[0]));
				banqueInfractions = BanqueInfractionsHelper.narrow(orb.string_to_object(args[1]));
			} else {
				NamingContextExt nc = NamingContextExtHelper.narrow(orb
						.resolve_initial_references("NameService"));

				org.omg.CORBA.Object o = nc.resolve(nc.to_name("log720.lab1"));

				banqueDossiers = BanqueDossiersHelper.narrow(o);
				banqueInfractions = BanqueInfractionsHelper.narrow(o);
			}

			// Initialisation des variables locales
			BufferedReader br = new BufferedReader(new FileReader(args[i]));
			String optionChoisie = "";
			
			// Affichage du menu principal et choix de l'option par l'utilisateur
			while (!optionChoisie.toLowerCase().equals("x")){
				System.out.println("\nMENU PRINCIPAL");
				System.out.println("===========================================");
				System.out.println("1. Ajouter un dossier à la banque de dossiers");
				System.out.println("2. Ajouter une infractions à la banque d'infractions");
				System.out.println("3. Visualiser la liste des dossiers");
				System.out.println("4. Visualiser la liste des infractions");
				System.out.println("X. Quitter");
				System.out.print("Veuillez entrer votre choix: ");
				
				optionChoisie = br.readLine();
				System.out.println(""); // On ajoute un saut de ligne après pour la lisibilité
				
				if(optionChoisie.equals("1")){
					ajouterDossierBanque();
				} else if(optionChoisie.equals("2")){
					ajouterInfractionBanque();
				} else if(optionChoisie.equals("3")){
					obtenirListeDossiers(banqueDossiers);
				} else if(optionChoisie.equals("4")){
					obtenirListeInfractions(banqueInfractions);
				} 
			}

			orb.shutdown(true);
			System.out.println("done. ");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Procédure servant à ajouter un dossier à la banque de dossiers. Un dossier possède les 
	 * informations suivantes:
	 *  - Nom
	 *  - Prénom
	 *  - Numéro de permis
	 *  - Numéro de plaque
	 */
	private void ajouterDossierBanque(){
		String nom = "";
		String prenom = "";
		String noPermis = "";
		String noPlaque = "";
	
		// On demande les informations à l'utilisateur
		System.out.println("\nVeuillez entrer les informations sur le nouveau dossier: ");
		System.out.print("Prénom: ");
		nom = br.readLine();
		
		System.out.print("\nNom: ");
		prenom = br.readLine();
		
		System.out.print("\nNuméro de permis: ");
		noPermis = br.readLine();
		
		System.out.print("\nNuméro de plaque: ");
		noPlaque = br.readLine();
		
		// On ajoute l'infraction à la banque d'infractions
		ajouterDossier(nom, prenom, noPermis, noPlaque);
		System.out.println("Le dossier a été ajouté à la banque de dossiers.\n");	
	}
	
	/**
	 * Procédure servant à ajouter une infraction à la banque d'infractions. Une infraction possède les 
	 * informations suivantes:
	 *  - La description de l'infraction
	 *  - Le niveau de l'infraction
	 */
	private void ajouterInfractionBanque(){
		String entreeUtilisateur = "";
		long niveau = -1;
		String description = "";
		
		// On demande à l'utilisateur la description de l'infraction à ajouter ainsi que son niveau
		System.out.print("\nVeuillez entrer la description de l'infraction à ajouter: ");
		description = br.readLine();
		
		System.out.print("\nVeuillez entrer le niveau de l'infraction: ");
		entreeUtilisateur = br.readLine();
		niveau = Long.valueOf(entreeUtilisateur).longValue();
		// ?AJOUTER DE LA VALIDATION DE STRING (doit être un entier)?
		
		// On ajoute l'infraction à la banque d'infractions
		ajouterInfraction(description, niveau);
		System.out.println("L'infraction a été ajoutée à la banque d'infractions.\n");	
	}
	
	/**
	 * Procédure servant à visualiser une liste des dossiers se trouvant dans la banque de dossiers.
	 */
	private void obtenirListeDossiers(BanqueDossiers banqueDossiers){
		CollectionDossier listeDossiers = banqueDossiers.getDossiers();
		Dossier dossierCourant;
		
		System.out.println("\nVoici la liste des dossiers dans la banque de dossiers"
							+ "(numéro de permis, prénom, nom, numéro de plaque, niveau):");	
		
		// On passe à travers la liste des dossiers de la banque de dossiers
		for (int i = 0; i < listeDossiers.getSize(); i++){
			dossierCourant = listeDossiers.getDossier(i);
			System.out.println(" - " + dossierCourant.getNoPermis + ",\t" 
									 + dossierCourant.getPrenom + ",\t" 
									 + dossierCourant.getNom + ",\t" 
									 + dossierCourant.getNoPlaque + ",\t" 
									 + dossierCourant.getNiveau);	
		}
	}

	/**
	 * Procédure servant à visualiser une liste des infractions se trouvant dans la banque d'infractions.
	 */
	private void obtenirListeInfractions(BanqueInfractions banqueInfractions){
		CollectionInfraction listeInfractions = banqueInfractions.getInfractions();
		Infraction infractionCourante;
		
		System.out.println("\nVoici la liste des infractions dans la banque d'infractions"
							+ "(id, description, niveau):");	
		
		// On passe à travers la liste des dossiers de la banque de dossiers
		for (int i = 0; i < listeInfractions.getSize(); i++){
			infractionCourante = listeInfractions.getInfractions(i);
			System.out.println(" - " + infractionCourante.getId + ",\t" 
									 + infractionCourante.getDescription + ",\t" 
									 + infractionCourante.getNiveau);	
		}
	}	
}
